home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1995 #5 & #6 / Amiga Plus CD - 1995 - No. 5 and 6.iso / pd / serien / purity / nr.5 / pascal / pcq-programme / game / collobjekt / collobjekt.test.p < prev    next >
Text File  |  1995-04-19  |  9KB  |  283 lines

  1. Program TestCollsion;
  2.  
  3. TYPE
  4.         Objekt = record
  5.             Ox      :   short;  { x-Position linke obere Ecke }
  6.             Oy      :   short;  { y-Position linke obere Ecke }
  7.             Sizex   :   short;  { x-size }
  8.             Sizey   :   short;  { y-size }
  9.             Speedx  :   short;  { x-Geschwindigkeit }
  10.             Speedy  :   short;  { y-Geschwindigkeit }
  11.             typ     :   short;  { Objekttyp }
  12.         end;
  13.  
  14. VAR
  15.         Objekts :   array[0..255] of Objekt;    { Max. Anzahl der Objekte }
  16.  
  17. CONST
  18.         Objektsize  :   integer = sizeof(Objekt); { Größe eines Objektes }
  19.  
  20. Function CollObjekt(von, bis, x1, y1, x2, y2 : short) : short;
  21. { Die Funktion ermittelt, welches Objekt in dem Rechteck x1, y1, x2, y2
  22.   Kollidiert ist. Hierbei kann ein von / bis Bereich für die Objekt-
  23.   untersuchung angegeben werden (0 - 255 ).
  24.   Wird als Von-Wert -1 angegeben, so werden alle Objekte untersucht und
  25.   die erste Objektnummer, die zur Kollision führte, zurück gegeben.
  26.   Ist der Rückgabewert -1, so gab es eine Kolision mit einem nicht
  27.   definierten Objekt bzw. das Objekt wurde nicht gefunden.
  28. }
  29.  
  30. begin
  31.  
  32. {$A
  33.     movem.l d1-d7/a0-a3,-(sp)   ; alle benutzten Register sichern
  34.                             ; Wahnsinn, 11 Stück !!!
  35.                             ; Die Parameter liegen deshalb auch
  36.                             ; an der um +44 Korrigierten SP-Adresse
  37.     lea     _Objekts,a0     ; 1. Adresse der Elemente laden
  38.     move.l  _Objektsize,a1  ; Größe der Objekte laden
  39.  
  40.  
  41.     move.w  56(sp),d1       ; bis (Urspünglich: 12(sp))
  42.  
  43.     move.w  58(sp),d2       ; von (Urspünglich: 14(sp))
  44.  
  45.     cmp.w   #0,d2           ; sollen alle Objekte untersucht werden ?
  46.     beq.s   CollObjekt2A    ; Sonderfall !!! Objekt ist 0
  47.     bmi.s   CollObjekt2     ; Dann müssen alle Objekte bearbeitet werden
  48.     movea.w d2,a3           ; sichern für den Rückgabezähler
  49.     sub.w   d2,d1           ; Anzahl der Objekte - 1 (für dbra)
  50.  
  51. CollObjekt1:
  52.     adda.l  a1,a0           ; Basisadresse + Objektgröße
  53.     subq    #1,d2           ; d2 erniedrigen
  54.     bne.s   CollObjekt1     ; Tatsächliche Adresse noch nicht ermittelt
  55.     bra.s   CollObjekt3     ; Steht jetzt in a0
  56.  
  57. CollObjekt2:
  58.     move.w  #255,d1         ; 256 Objekte sind zu bearbeiten
  59.     move.w  #0,a3           ; 1. zu bearbeitende Objektnummer
  60.     bra.s   CollObjekt3     ; weiter gehts
  61.  
  62. CollObjekt2A:
  63.     move.w  #0,d1           ; 1  Objekt ist zu bearbeiten
  64.     move.w  #0,a3           ; 1. zu bearbeitende Objektnummer
  65.  
  66. CollObjekt3:
  67.                             ; a0 = Startadresse des 1. Objektes
  68.                             ; a1 = Größe des Objektes
  69.                             ; a3 = Nummer des ersten Objektes
  70.                             ; d1 = Anzahl der Objekte -1
  71.  
  72.     move.w  48(sp),d4       ; y2 (Urspünglich: 4(sp))
  73.  
  74.     move.w  50(sp),d5       ; x2 (Urspünglich: 6(sp))
  75.  
  76.     move.w  52(sp),d6       ; y1 (Urspünglich: 8(sp))
  77.  
  78.     move.w  54(sp),d7       ; x1 (Urspünglich: 10(sp))
  79.  
  80.  
  81. CollObjektLoop:
  82.                             ; Ab hier beginnt die Fragerei immer wieder
  83.     move.w  (a0),d2         ; Ox1-Position in D2
  84.     bmi     CollObjektNext  ; zur Beschleunigung der Abfrage, da Objekt
  85.                             ; tot ist.
  86.     move.w  2(a0),d3        ; Oy1-Position in D3
  87.  
  88.  
  89.     cmp.w   d7,d2           ; Ox1 >= Tx1
  90.     bge.s   CollObjekt4     ; Ja
  91.     bra.s   CollObjekt10    ; nein
  92. CollObjekt4:
  93.     cmp.w   d5,d2           ; Ox1 <= Tx2
  94.     bls.s   CollObjekt100   ; Ja
  95.                             ; nein, weiter bei Stufe 10
  96. CollObjekt10:
  97.     add.w   4(a0),d2        ; Ox1 um den x-size Wert erhöhen, um Ox2 zu bekommen
  98.     cmp.w   d7,d2           ; Ox2 >= Tx1
  99.     bge.s   CollObjekt11    ; Ja
  100.     bra.s   CollObjekt20    ; nein
  101.  
  102. CollObjekt11:
  103.     cmp.w   d5,d2           ; Ox2 <= Tx2
  104.     bls.s   CollObjekt100   ; Ja
  105.                             ; nein, weiter bei Stufe 20
  106. CollObjekt20:
  107.     move.w  (a0),d2         ; Ox1 wieder auf den alten Wert bringen
  108.     cmp.w   d2,d7           ; Tx1 >= Ox1
  109.     bge.s   CollObjekt21    ; Ja
  110.     bra.s   CollObjekt30    ; nein
  111.  
  112. CollObjekt21:
  113.     add.w   4(a0),d2        ; Ox1 um den x-size Wert erhöhen, um Ox2 zu bekommen
  114.     cmp.w   d2,d7           ; Tx1 <= Ox2
  115.     bls.s   CollObjekt100   ; Ja
  116.                             ; nein, weiter bei Stufe 30
  117. CollObjekt30:
  118.     move.w  (a0),d2         ; Ox1 wieder auf den alten Wert bringen
  119.     cmp.w   d2,d5           ; Tx2 >= Ox1
  120.     bge.s   CollObjekt31    ; Ja
  121.     bra     CollObjektNext  ; nein, also kein Treffer
  122.  
  123. CollObjekt31:
  124.     add.w   4(a0),d2        ; Ox1 um den x-size Wert erhöhen, um Ox2 zu bekommen
  125.     cmp.w   d2,d5           ; Tx1 <= Ox2
  126.     bls.s   CollObjekt100   ; Ja
  127.     bra     CollObjektNext  ; nein, also kein Treffer
  128.  
  129. CollObjekt100:
  130.     cmp.w   d6,d3           ; Oy1 >= Ty1
  131.     bge.s   CollObjekt101   ; Ja
  132.     bra.s   CollObjekt110   ; nein
  133. CollObjekt101:
  134.     cmp.w   d4,d3           ; Oy1 <= Ty2
  135.     bls.s   CollObjekt200   ; Ja
  136.                             ; nein, weiter bei Stufe 110
  137. CollObjekt110:
  138.     add.w   6(a0),d3        ; Oy1 um den y-size Wert erhöhen, um Oy2 zu bekommen
  139.     cmp.w   d6,d3           ; Oy2 >= Ty1
  140.     bge.s   CollObjekt111   ; Ja
  141.     bra.s   CollObjekt120   ; nein
  142.  
  143. CollObjekt111:
  144.     cmp.w   d4,d3           ; Oy2 <= Ty2
  145.     bls.s   CollObjekt200   ; Ja
  146.                             ; nein, weiter bei Stufe 120
  147. CollObjekt120:
  148.     move.w  2(a0),d3        ; Oy1 wieder auf den alten Wert bringen
  149.     cmp.w   d3,d6           ; Ty1 >= Oy1
  150.     bge.s   CollObjekt121   ; Ja
  151.     bra.s   CollObjekt130   ; nein
  152.  
  153. CollObjekt121:
  154.     add.w   6(a0),d3        ; Oy1 um den y-size Wert erhöhen, um Oy2 zu bekommen
  155.     cmp.w   d3,d6           ; Ty1 <= Oy2
  156.     bls.s   CollObjekt200   ; Ja
  157.                             ; nein, weiter bei Stufe 130
  158. CollObjekt130:
  159.     move.w  2(a0),d3        ; Oy1 wieder auf den alten Wert bringen
  160.     cmp.w   d3,d4           ; Ty2 >= Oy1
  161.     bge.s   CollObjekt131   ; Ja
  162.     bra.s   CollObjektNext  ; nein, also kein Treffer
  163.  
  164. CollObjekt131:
  165.     add.w   6(a0),d3        ; Oy1 um den y-size Wert erhöhen, um Oy2 zu bekommen
  166.     cmp.w   d3,d4           ; Tx1 <= Ox2
  167.     bls.s   CollObjekt200   ; Ja
  168.     bra.s   CollObjektNext  ; nein, also kein Treffer
  169.  
  170. CollObjekt200:
  171.                             ; Alle Bedingungen sind erfüllt worden,
  172.                             ; also ein Treffer
  173.     move.w  a3,d0           ; die getroffene Objektnummer in d0
  174.     bra.s   CollObjektEnd   ; und ab dafür
  175.  
  176. CollObjektNext:
  177.                             ; Eine oder mehrere Bedingungen wurden nicht
  178.                             ; erfüllt. Also das nächste Objekt.
  179.     adda.l  a1,a0           ; Nächste Objektadresse
  180.     adda.w  #1,a3           ; Objektnummer um eins erhöhen
  181.     dbra.s  d1,CollObjektLoop   ; und weiter geht's
  182.  
  183.     moveq   #-1,d0          ; wir haben kein passendes Objekt gefunden,
  184.                             ; also Fehler
  185.  
  186. CollObjektEnd:
  187.  
  188.     movem.l (sp)+,d1-d7/a0-a3   ; alle benutzten Register wieder zurück
  189. }
  190. end;
  191.  
  192. var
  193.     ergebnis    : short;
  194.     i           : short;
  195.     c           : char;
  196.  
  197. begin
  198.     Objekts[0].Ox := 30;
  199.     Objekts[0].Oy := 5;
  200.     Objekts[0].Sizex := 15;
  201.     Objekts[0].Sizey := 65;
  202.     Objekts[1].Ox := 25;
  203.     Objekts[1].Oy := 15;
  204.     Objekts[1].Sizex := 5;
  205.     Objekts[1].Sizey := 5;
  206.     Objekts[2].Ox := 40;
  207.     Objekts[2].Oy := 5;
  208.     Objekts[2].Sizex := 15;
  209.     Objekts[2].Sizey := 75;
  210.     Objekts[3].Ox := 5;
  211.     Objekts[3].Oy := 5;
  212.     Objekts[3].Sizex := 10;
  213.     Objekts[3].Sizey := 65;
  214.     Objekts[4].Ox := 50;
  215.     Objekts[4].Oy := 50;
  216.     Objekts[4].Sizex := 50;
  217.     Objekts[4].Sizey := 40;
  218.     Objekts[5].Ox := 200;
  219.     Objekts[5].Oy := 80;
  220.     Objekts[5].Sizex := 40;
  221.     Objekts[5].Sizey := 80;
  222.     Objekts[6].Ox := 200;
  223.     Objekts[6].Oy := 120;
  224.     Objekts[6].Sizex := 40;
  225.     Objekts[6].Sizey := 80;
  226.  
  227.     for i := 7 to 255 do
  228.         Objekts[i].ox := -1;
  229.  
  230. { Die nachfolgenden Ergebnisse waren alle O.K.}
  231.  
  232.     ergebnis := CollObjekt(0,0,10,10,50,50);
  233.     writeln("CollObjekt(0,0,10,10,50,50)", ergebnis);
  234.     readln(c);
  235.  
  236.     ergebnis := CollObjekt(1,1,10,10,50,50);
  237.     writeln("CollObjekt(1,1,10,10,50,50)", ergebnis);
  238.     readln(c);
  239.  
  240.     ergebnis := CollObjekt(2,2,10,10,50,50);
  241.     writeln("CollObjekt(2,2,10,10,50,50)", ergebnis);
  242.     readln(c);
  243.  
  244.     ergebnis := CollObjekt(3,3,10,10,50,50);
  245.     writeln("CollObjekt(3,3,10,10,50,50)", ergebnis);
  246.     readln(c);
  247.  
  248.     ergebnis := CollObjekt(4,4,10,10,50,50);
  249.     writeln("CollObjekt(4,4,10,10,50,50)", ergebnis);
  250.     readln(c);
  251. {}
  252.  
  253.     ergebnis := CollObjekt(5,5,100,100,600,100);
  254.     writeln("CollObjekt(5,5,100,100,600,100)", ergebnis);
  255.     readln(c);
  256.  
  257.     ergebnis := CollObjekt(-1,5,100,100,600,100);
  258.     writeln("CollObjekt(-1,5,100,100,600,100)", ergebnis);
  259.     readln(c);
  260.  
  261.  
  262.     ergebnis := CollObjekt(1,1,10,17,600,17);
  263.     writeln("CollObjekt(1,1,10,17,600,17)", ergebnis);
  264.     readln(c);
  265.  
  266.  
  267. {   }
  268.     ergebnis := CollObjekt(6,6,100,100,600,100);
  269.     writeln("CollObjekt(6,6,100,100,600,100)", ergebnis);
  270.     readln(c);
  271.  
  272.     ergebnis := CollObjekt(-1,5,100,100,600,100);
  273.     writeln("CollObjekt(-1,5,100,100,600,100)", ergebnis);
  274.     readln(c);
  275.  
  276.     ergebnis := CollObjekt(-1,5,610,100,620,100);
  277.     writeln("CollObjekt(-1,5,610,100,620,100)", ergebnis);
  278.     readln(c);
  279.  
  280. {}
  281.  
  282. end.
  283.